<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>jsoop多态</title>
</head>
<body>
    <h1>多态</h1>
</body>
<script>
    var Rect=function(){
        this.draw=function(){
            console.log("画个矩形");
        }
    }
    var Circle=function(){
        this.draw=function(){
            console.log("画个圆形");
        }
    }
    //模拟多态
    function test(obj){
        obj.draw();
    }
    // test(new Circle())


    /*
    作业
    创建一个Person类，包含name公开的属性，age受保护的属性，这个值只能是数字，私有的属性account。
    创建一个showMoney私有的方法，在这个方法中打印出account的值。
    创建一个showMsg公开的方法，在这个方法中打印出name和age，并且调用showMoney方法。
    创建一个交通类Trafic和它的两个子类Car和Bike，通过多态实现每种交通工具的run方法。
    */
   var Person=function(name){   
    this.name=name;//公开的属性
    var account="私房钱";//私有属性
    var showMoney=function(){   //私有方法showMoney
        console.log("account的值:"+account);
    }
    var _age=0;//受保护的
    var num=/\d/;
    Object.defineProperty(this,"age",{
        get:function(){
            return _age;
        },
        set:function(val){
            if(num.test(val)){
                _age=val;
            }else{
                console.log("age只能是数字");
            }
        }
    })
    this.showMsg=function(){    //公有方法showMsg()
        console.log("name:"+this.name+";age:"+this.age);
        showMoney();//调用
    }
   }
   Object.copy=function(a,b){
       for(var attr in b){
           a[attr]=b[attr];
       }
       return a;
   }
   Object.prototype.extends=function(o){
       return Object.copy(this,o)
   }
   var ren1=new Person("肖");
   ren1.age="2";
   ren1.showMsg();
   //继承
   var Trafic=function(){
        this._run=function(){
            //调用下方空方法
            this.run();
        }
        //空方法
        this.run=function(){}
   }
   var Car=function(){}
   var Bike=function(){}
   Car.prototype=(new Trafic()).extends({
       run :function(){
        console.log("汽车动起来.....");
       }
   });
   Bike.prototype=(new Trafic()).extends({
       run :function(){
        console.log("自行车GoGoGo.....");
       }
   });
   var car1=new Car();
   var bike1=new Bike();
   car1.run()
   bike1.run()
   //多态
   var Trafic1=function(obj){
            obj.runn();
        }
        var Car1=function(){};
        Car1.prototype.runn=function(){
            console.log("开车回家！");
        }
        Trafic1(new Car1());

        var Bike1=function(){};
        Bike1.prototype.runn=function(){
            console.log("骑自行车回家！");
        }

</script>
</html>